<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/proportions.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/proportions.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/*</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> * FLoating proportions</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> *</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> *  Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra &lt;pzijlstr@redhat.com&gt;</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> *</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> * This file contains the public data structure and API definitions.</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> */</span>
<a name="8" /><span class="True">       8:</span> 
<a name="9" /><span class="True">       9:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX1BST1BPUlRJT05TX0hfMA__"><span class="b">_LINUX_PROPORTIONS_H</span></a>
<a name="10" /><span class="True">      10:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX1BST1BPUlRJT05TX0hfMA__"><span class="b">_LINUX_PROPORTIONS_H</span></a>
<a name="11" /><span class="True">      11:</span> 
<a name="12" /><span class="True">      12:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">percpu_counter</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="True">      13:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">spinlock</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="True">      14:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">mutex</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="15" /><span class="True">      15:</span> 
<a name="16" /><span class="True">      16:</span> <span class="m">struct</span> <span class="b">prop_global</span> <span class="f">{</span>
<a name="17" /><span class="True">      17:</span>     <span class="k">/*</span>
<a name="18" /><span class="True">      18:</span> <span class="k">     * The period over which we differentiate</span>
<a name="19" /><span class="True">      19:</span> <span class="k">     *</span>
<a name="20" /><span class="True">      20:</span> <span class="k">     *   period = 2^shift</span>
<a name="21" /><span class="True">      21:</span> <span class="k">     */</span>
<a name="22" /><span class="True">      22:</span>     <span class="m">int</span> <span class="b">shift</span><span class="f">;</span>
<a name="23" /><span class="True">      23:</span>     <span class="k">/*</span>
<a name="24" /><span class="True">      24:</span> <span class="k">     * The total event counter aka &apos;time&apos;.</span>
<a name="25" /><span class="True">      25:</span> <span class="k">     *</span>
<a name="26" /><span class="True">      26:</span> <span class="k">     * Treated as an unsigned long; the lower &apos;shift - 1&apos; bits are the</span>
<a name="27" /><span class="True">      27:</span> <span class="k">     * counter bits, the remaining upper bits the period counter.</span>
<a name="28" /><span class="True">      28:</span> <span class="k">     */</span>
<a name="29" /><span class="True">      29:</span>     <span class="m">struct</span> <span class="b">percpu_counter</span> <span class="b">events</span><span class="f">;</span>
<a name="30" /><span class="True">      30:</span> <span class="f">}</span><span class="f">;</span>
<a name="31" /><span class="True">      31:</span> 
<a name="32" /><span class="True">      32:</span> <span class="k">/*</span>
<a name="33" /><span class="True">      33:</span> <span class="k"> * global proportion descriptor</span>
<a name="34" /><span class="True">      34:</span> <span class="k"> *</span>
<a name="35" /><span class="True">      35:</span> <span class="k"> * this is needed to consitently flip prop_global structures.</span>
<a name="36" /><span class="True">      36:</span> <span class="k"> */</span>
<a name="37" /><span class="True">      37:</span> <span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">{</span>
<a name="38" /><span class="True">      38:</span>     <span class="m">int</span> <span class="b">index</span><span class="f">;</span>
<a name="39" /><span class="True">      39:</span>     <span class="m">struct</span> <span class="b">prop_global</span> <span class="b">pg</span><span class="f">[</span><span class="c">2</span><span class="f">]</span><span class="f">;</span>
<a name="40" /><span class="True">      40:</span>     <span class="m">struct</span> <span class="b">mutex</span> <span class="b">mutex</span><span class="f">;</span>        <span class="k">/* serialize the prop_global switch */</span>
<a name="41" /><span class="True">      41:</span> <span class="f">}</span><span class="f">;</span>
<a name="42" /><span class="True">      42:</span> 
<a name="43" /><span class="True">      43:</span> <span class="m">int</span> <span class="b">prop_descriptor_init</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span><span class="f">;</span>
<a name="44" /><span class="True">      44:</span> <span class="m">void</span> <span class="b">prop_change_shift</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">int</span> <span class="b">new_shift</span><span class="f">)</span><span class="f">;</span>
<a name="45" /><span class="True">      45:</span> 
<a name="46" /><span class="True">      46:</span> <span class="k">/*</span>
<a name="47" /><span class="True">      47:</span> <span class="k"> * ----- PERCPU ------</span>
<a name="48" /><span class="True">      48:</span> <span class="k"> */</span>
<a name="49" /><span class="True">      49:</span> 
<a name="50" /><span class="True">      50:</span> <span class="m">struct</span> <span class="b">prop_local_percpu</span> <span class="f">{</span>
<a name="51" /><span class="True">      51:</span>     <span class="k">/*</span>
<a name="52" /><span class="True">      52:</span> <span class="k">     * the local events counter</span>
<a name="53" /><span class="True">      53:</span> <span class="k">     */</span>
<a name="54" /><span class="True">      54:</span>     <span class="m">struct</span> <span class="b">percpu_counter</span> <span class="b">events</span><span class="f">;</span>
<a name="55" /><span class="True">      55:</span> 
<a name="56" /><span class="True">      56:</span>     <span class="k">/*</span>
<a name="57" /><span class="True">      57:</span> <span class="k">     * snapshot of the last seen global state</span>
<a name="58" /><span class="True">      58:</span> <span class="k">     */</span>
<a name="59" /><span class="True">      59:</span>     <span class="m">int</span> <span class="b">shift</span><span class="f">;</span>
<a name="60" /><span class="True">      60:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">period</span><span class="f">;</span>
<a name="61" /><span class="True">      61:</span>     <span class="b">raw_spinlock_t</span> <span class="b">lock</span><span class="f">;</span>        <span class="k">/* protect the snapshot state */</span>
<a name="62" /><span class="True">      62:</span> <span class="f">}</span><span class="f">;</span>
<a name="63" /><span class="True">      63:</span> 
<a name="64" /><span class="True">      64:</span> <span class="m">int</span> <span class="b">prop_local_init_percpu</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_local_percpu</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="65" /><span class="True">      65:</span> <span class="m">void</span> <span class="b">prop_local_destroy_percpu</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_local_percpu</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="66" /><span class="True">      66:</span> <span class="m">void</span> <span class="b">__prop_inc_percpu</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">struct</span> <span class="b">prop_local_percpu</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="67" /><span class="True">      67:</span> <span class="m">void</span> <span class="b">prop_fraction_percpu</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">struct</span> <span class="b">prop_local_percpu</span> <span class="f">*</span><span class="b">pl</span><span class="f">,</span>
<a name="68" /><span class="True">      68:</span>         <span class="m">long</span> <span class="f">*</span><span class="b">numerator</span><span class="f">,</span> <span class="m">long</span> <span class="f">*</span><span class="b">denominator</span><span class="f">)</span><span class="f">;</span>
<a name="69" /><span class="True">      69:</span> 
<a name="70" /><span class="True">      70:</span> <span class="m">static</span> <span class="m">inline</span>
<a name="71" /><span class="True">      71:</span> <span class="m">void</span> <span class="b">prop_inc_percpu</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">struct</span> <span class="b">prop_local_percpu</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span>
<a name="72" /><span class="True">      72:</span> <span class="f">{</span>
<a name="73" /><span class="True">      73:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="74" /><span class="True">      74:</span> 
<a name="75" /><span class="True">      75:</span>     <a href="cpu.c_macros_ref.html#_bG9jYWxfaXJxX3NhdmVfMA__"><span class="b">local_irq_save</span></a><span class="f">(</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="76" /><span class="True">      76:</span>     <span class="b">__prop_inc_percpu</span><span class="f">(</span><span class="b">pd</span><span class="f">,</span> <span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="77" /><span class="True">      77:</span>     <a href="cpu.c_macros_ref.html#_bG9jYWxfaXJxX3Jlc3RvcmVfMA__"><span class="b">local_irq_restore</span></a><span class="f">(</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="78" /><span class="True">      78:</span> <span class="f">}</span>
<a name="79" /><span class="True">      79:</span> 
<a name="80" /><span class="True">      80:</span> <span class="k">/*</span>
<a name="81" /><span class="True">      81:</span> <span class="k"> * Limit the time part in order to ensure there are some bits left for the</span>
<a name="82" /><span class="True">      82:</span> <span class="k"> * cycle counter and fraction multiply.</span>
<a name="83" /><span class="True">      83:</span> <span class="k"> */</span>
<a name="84" /><span class="False">      84:</span> <span class="f">#</span><span class="n">if</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a> <span class="f">==</span> <span class="c">32</span>
<a name="85" /><span class="False">      85:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UFJPUF9NQVhfU0hJRlRfMA__"><span class="b">PROP_MAX_SHIFT</span></a> <span class="f">(</span><span class="c">3</span><span class="f">*</span><a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a><span class="f">/</span><span class="c">4</span><span class="f">)</span>
<a name="86" /><span class="True">      86:</span> <span class="f">#</span><span class="n">else</span>
<a name="87" /><span class="True">      87:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UFJPUF9NQVhfU0hJRlRfMA__"><span class="b">PROP_MAX_SHIFT</span></a> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a><span class="f">/</span><span class="c">2</span><span class="f">)</span>
<a name="88" /><span class="True">      88:</span> <span class="f">#</span><span class="n">endif</span>
<a name="89" /><span class="True">      89:</span> 
<a name="90" /><span class="True">      90:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UFJPUF9GUkFDX1NISUZUXzA_"><span class="b">PROP_FRAC_SHIFT</span></a>        <span class="f">(</span><a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a> <span class="f">-</span> <a href="cpu.c_macros_noref.html#_UFJPUF9NQVhfU0hJRlRfMA__"><span class="b">PROP_MAX_SHIFT</span></a> <span class="f">-</span> <span class="c">1</span><span class="f">)</span>
<a name="91" /><span class="True">      91:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UFJPUF9GUkFDX0JBU0VfMA__"><span class="b">PROP_FRAC_BASE</span></a>        <span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <a href="cpu.c_macros_noref.html#_UFJPUF9GUkFDX1NISUZUXzA_"><span class="b">PROP_FRAC_SHIFT</span></a><span class="f">)</span>
<a name="92" /><span class="True">      92:</span> 
<a name="93" /><span class="True">      93:</span> <span class="m">void</span> <span class="b">__prop_inc_percpu_max</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span>
<a name="94" /><span class="True">      94:</span>                <span class="m">struct</span> <span class="b">prop_local_percpu</span> <span class="f">*</span><span class="b">pl</span><span class="f">,</span> <span class="m">long</span> <span class="b">frac</span><span class="f">)</span><span class="f">;</span>
<a name="95" /><span class="True">      95:</span> 
<a name="96" /><span class="True">      96:</span> 
<a name="97" /><span class="True">      97:</span> <span class="k">/*</span>
<a name="98" /><span class="True">      98:</span> <span class="k"> * ----- SINGLE ------</span>
<a name="99" /><span class="True">      99:</span> <span class="k"> */</span>
<a name="100" /><span class="True">     100:</span> 
<a name="101" /><span class="True">     101:</span> <span class="m">struct</span> <span class="b">prop_local_single</span> <span class="f">{</span>
<a name="102" /><span class="True">     102:</span>     <span class="k">/*</span>
<a name="103" /><span class="True">     103:</span> <span class="k">     * the local events counter</span>
<a name="104" /><span class="True">     104:</span> <span class="k">     */</span>
<a name="105" /><span class="True">     105:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">events</span><span class="f">;</span>
<a name="106" /><span class="True">     106:</span> 
<a name="107" /><span class="True">     107:</span>     <span class="k">/*</span>
<a name="108" /><span class="True">     108:</span> <span class="k">     * snapshot of the last seen global state</span>
<a name="109" /><span class="True">     109:</span> <span class="k">     * and a lock protecting this state</span>
<a name="110" /><span class="True">     110:</span> <span class="k">     */</span>
<a name="111" /><span class="True">     111:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">period</span><span class="f">;</span>
<a name="112" /><span class="True">     112:</span>     <span class="m">int</span> <span class="b">shift</span><span class="f">;</span>
<a name="113" /><span class="True">     113:</span>     <span class="b">raw_spinlock_t</span> <span class="b">lock</span><span class="f">;</span>        <span class="k">/* protect the snapshot state */</span>
<a name="114" /><span class="True">     114:</span> <span class="f">}</span><span class="f">;</span>
<a name="115" /><span class="True">     115:</span> 
<a name="116" /><span class="True">     116:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5JVF9QUk9QX0xPQ0FMX1NJTkdMRV8w"><span class="b">INIT_PROP_LOCAL_SINGLE</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>            \
<a name="117" /><span class="True">     117:</span> <span class="f">{</span>    <span class="f">.</span><span class="b">lock</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEXzA_"><span class="b">__RAW_SPIN_LOCK_UNLOCKED</span></a><span class="f">(</span><span class="b">name</span><span class="f">.</span><span class="b">lock</span><span class="f">)</span><span class="f">,</span>    \
<a name="118" /><span class="True">     118:</span> <span class="f">}</span>
<a name="119" /><span class="True">     119:</span> 
<a name="120" /><span class="True">     120:</span> <span class="m">int</span> <span class="b">prop_local_init_single</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_local_single</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="121" /><span class="True">     121:</span> <span class="m">void</span> <span class="b">prop_local_destroy_single</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_local_single</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="122" /><span class="True">     122:</span> <span class="m">void</span> <span class="b">__prop_inc_single</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">struct</span> <span class="b">prop_local_single</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="123" /><span class="True">     123:</span> <span class="m">void</span> <span class="b">prop_fraction_single</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">struct</span> <span class="b">prop_local_single</span> <span class="f">*</span><span class="b">pl</span><span class="f">,</span>
<a name="124" /><span class="True">     124:</span>         <span class="m">long</span> <span class="f">*</span><span class="b">numerator</span><span class="f">,</span> <span class="m">long</span> <span class="f">*</span><span class="b">denominator</span><span class="f">)</span><span class="f">;</span>
<a name="125" /><span class="True">     125:</span> 
<a name="126" /><span class="True">     126:</span> <span class="m">static</span> <span class="m">inline</span>
<a name="127" /><span class="True">     127:</span> <span class="m">void</span> <span class="b">prop_inc_single</span><span class="f">(</span><span class="m">struct</span> <span class="b">prop_descriptor</span> <span class="f">*</span><span class="b">pd</span><span class="f">,</span> <span class="m">struct</span> <span class="b">prop_local_single</span> <span class="f">*</span><span class="b">pl</span><span class="f">)</span>
<a name="128" /><span class="True">     128:</span> <span class="f">{</span>
<a name="129" /><span class="True">     129:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="130" /><span class="True">     130:</span> 
<a name="131" /><span class="True">     131:</span>     <a href="cpu.c_macros_ref.html#_bG9jYWxfaXJxX3NhdmVfMA__"><span class="b">local_irq_save</span></a><span class="f">(</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="132" /><span class="True">     132:</span>     <span class="b">__prop_inc_single</span><span class="f">(</span><span class="b">pd</span><span class="f">,</span> <span class="b">pl</span><span class="f">)</span><span class="f">;</span>
<a name="133" /><span class="True">     133:</span>     <a href="cpu.c_macros_ref.html#_bG9jYWxfaXJxX3Jlc3RvcmVfMA__"><span class="b">local_irq_restore</span></a><span class="f">(</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="134" /><span class="True">     134:</span> <span class="f">}</span>
<a name="135" /><span class="True">     135:</span> 
<a name="136" /><span class="True">     136:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_PROPORTIONS_H */</span>
<a name="137" /><span class="True">     137:</span> </pre>
  </body>
</html>
